<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>嵌套的箭头函数</title>
</head>
<body>
<script>
  // ES5 多层嵌套 费劲 尽量少用
  function insert(value) {
    return {into: function (array) {
      return {after: function (afterValue) {
        array.splice(array.indexOf(afterValue) + 1, 0, value);
        return array;
      }};
    }};
  }

  insert(2).into([1, 3]).after(1); //[1, 2, 3]
  // 真的费劲
  let insert = (value) => ({into: (array) => ({after: (afterValue) => {
    array.splice(array.indexOf(afterValue) + 1, 0, value);
    return array;
  }})});

  insert(2).into([1, 3]).after(1); //[1, 2, 3]

  // 1. 部署管道机制（pipeline）：即前一个函数的输出是后一个函数的输入：
  const pipeline = (...funcs) =>
    val => funcs.reduce((a, b) => b(a), val);

  const plus1 = a => a + 1;
  const mult2 = a => a * 2;
  const addThenMult = pipeline(plus1, mult2);
  addThenMult(5)// 12
  // 改写如下：
  const plus1 = a => a + 1;
  const mult2 = a => a * 2;

  mult2(plus1(5))// 12

  // 2. 关于计算机科学的 （像个入字的符号）的运算【估计这辈子都用不到】：
  // λ演算的写法
  fix = λf.(λx.f(λv.x(x)(v)))(λx.f(λv.x(x)(v)))

  // ES6的写法
  var fix = f => (x => f(v => x(x)(v)))
  (x => f(v => x(x)(v)));
</script>
</body>
</html>